<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>Package Configuration</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="core-developers-guide.html">Core Developers Guide</a>&nbsp;&gt;&nbsp;<a href="configuration-elements.html">Configuration Elements</a>&nbsp;&gt;&nbsp;<a href="package-configuration.html">Package Configuration</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">Package Configuration</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14050">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14050">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14050">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14050">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14050">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14050">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><p>Packages are a way to group actions, results, result types, interceptors, and interceptor-stacks into a logical configuration unit. Conceptually, packages are similiar to objects in that they can be extended and have individual parts that can be overridden by "sub" packages.</p>

<h2 id="PackageConfiguration-Packages">Packages</h2>

<p>The package element has one required attribute, <code>name</code>, which acts as the key for later reference to the package. The <code>extends</code> attribute is optional and allows one package to inherit the configuration of one or more previous packages - including all interceptor, interceptor-stack, and action configurations.</p>

<p><img class="emoticon emoticon-warning" src="https://cwiki.apache.org/confluence/s/en_GB/5982/f2b47fb3d636c8bc9fd0b11c0ec6d0ae18646be7.1/_/images/icons/emoticons/warning.png" data-emoticon-name="warning" alt="(warning)"> Note that the configuration file is processed sequentially down the document, so the package referenced by an "extends" should be defined <em>above</em> the package which extends it.</p>

<p>The optional <code>abstract</code> attribute creates a base package that can omit the action configuration.</p>
<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Attribute </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Required </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> name </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <strong>yes</strong> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> key to for other packages to reference </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> extends </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> no </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> inherits package behavior of the package it extends </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> namespace </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> no </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> see <a shape="rect" href="namespace-configuration.html">Namespace Configuration</a> </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> abstract </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> no </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> declares package to be abstract (no action configurations required in package) </p></td></tr></tbody></table></div>


<h3 id="PackageConfiguration-Simpleusage">Simple usage </h3>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Package Example (struts.xml)</b></div><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
&lt;struts&gt;
  &lt;package name="employee" extends="struts-default" namespace="/employee"&gt;
    &lt;default-interceptor-ref name="crudStack"/&gt;

    &lt;action name="list" method="list"
      class="org.apache.struts2.showcase.action.EmployeeAction" &gt;
        &lt;result&gt;/empmanager/listEmployees.jsp&lt;/result&gt;
        &lt;interceptor-ref name="basicStack"/&gt;
    &lt;/action&gt;
    &lt;action name="edit-*" class="org.apache.struts2.showcase.action.EmployeeAction"&gt;
      &lt;param name="empId"&gt;{1}&lt;/param&gt;
      &lt;result&gt;/empmanager/editEmployee.jsp&lt;/result&gt;
        &lt;interceptor-ref name="crudStack"&gt;
          &lt;param name="validation.excludeMethods"&gt;execute&lt;/param&gt;
        &lt;/interceptor-ref&gt;
      &lt;/action&gt;
      &lt;action name="save" method="save"
          class="org.apache.struts2.showcase.action.EmployeeAction" &gt;
        &lt;result name="input"&gt;/empmanager/editEmployee.jsp&lt;/result&gt;
        &lt;result type="redirect"&gt;edit-${currentEmployee.empId}.action&lt;/result&gt;
      &lt;/action&gt;
      &lt;action name="delete" method="delete"
        class="org.apache.struts2.showcase.action.EmployeeAction" &gt;
        &lt;result name="error"&gt;/empmanager/editEmployee.jsp&lt;/result&gt;
        &lt;result type="redirect"&gt;edit-${currentEmployee.empId}.action&lt;/result&gt;
      &lt;/action&gt;
  &lt;/package&gt;
&lt;/struts&gt;
</pre>
</div></div>

<h3 id="PackageConfiguration-Inheritfrommorethanonepackage">Inherit from more than one package</h3>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Multi package Example (struts.xml)</b></div><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
&lt;struts&gt;
  &lt;package name="employee" extends="struts-default, json-default" namespace="/employee"&gt;

    &lt;action name="list" method="list" class="org.apache.struts2.showcase.action.EmployeeAction" &gt;
        &lt;result&gt;/empmanager/listEmployees.jsp&lt;/result&gt;
        &lt;result type="json"&gt;
            &lt;param name="root"&gt;employees&lt;/param&gt;
        &lt;/result&gt;
    &lt;/action&gt;

  &lt;/package&gt;
&lt;/struts&gt;
</pre>
</div></div></div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
